/*
 * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: CC0-1.0
 */

#include "c3_main.h"
#include "wifi.h"
#include "mqtt_khd.h"
#include "zhongduan.h" //中断
#include "zhiXing.h"

#include "esp_log.h"

static const char *TAG = "c3_main: ";
#define led_pin GPIO_NUM_2
#define led_deng_dai GPIO_NUM_20

// 多线程,定义消息缓冲区句柄
MessageBufferHandle_t zhuanFanP; // 所有接收到的消息转发
QueueHandle_t wifiQueue;         // 消息队列
QueueHandle_t mqttQueue;         // 消息队列

bool jian_la_huan_chong_qu() // 以动态分配内存的方式建立消息缓冲区
{
    // 以动态分配内存的方式建立消息缓冲区
    // pwmP = xMessageBufferCreate(PWNP_XIAO_XI);
    // kongZhiP = xMessageBufferCreate(KONGZHIP_XIAO_XI);
    zhuanFanP = xMessageBufferCreate(ZHUAN_FA_XIAO_XI);
    wifiQueue = xQueueCreate(3, sizeof(uint16_t)); // 传递uint16_t类型消息
    mqttQueue = xQueueCreate(3, sizeof(uint16_t)); // 传递uint16_t类型消息
    if (zhuanFanP == NULL || wifiQueue == NULL || mqttQueue == NULL)
    {
        ESP_LOGI(TAG, "huan chong qu jian li shi bai 001\n");
        return false;
    }
    else
    {
        ESP_LOGD(TAG, "huan chong qu jian li cheng gong 001\n");
        return true;
    }
}

/*时间同步*/
void shi_jian_SNTP_1()
{
    esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("pool.ntp.org");
    esp_netif_sntp_init(&config);
}

void xin_pian_xin_xi() // 打印芯片信息
{
    /* *******************打印芯片信息*********** */
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

    unsigned major_rev = chip_info.revision / 100; // 获取芯片版本号
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if (esp_flash_get_size(NULL, &flash_size) != ESP_OK)
    {
        printf("Get flash size failed");
        return;
    }

    printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %" PRIu32 " bytes\r\n", esp_get_minimum_free_heap_size());
    ESP_LOGI(TAG, "芯片信息打印完毕\r\n");
    /***************** 打印芯片信息******** */
}
void app_main(void)
{
    gpioInit(); // io口初始化
    gpio_set_level(KAI_GUAN_02, 1);
    jian_la_huan_chong_qu();
    wifi_init("cccxxx", "chenxin1234567890");
    // xin_pian_xin_xi();
    mqtt_init(); // 启动mqtt

    xTaskCreate(xiao_xi_fen_fa,   // 指向任务入口函数的指针。任务必须实现为永不返回（即连续循环），或者应该使用 vTaskDelete 函数终止
                "xiao_xi_fen_fa", // 任务的描述性名称。这主要是为了*方便调试。configMAX_TASK_NAME_LEN 定义的最大长度 - 默认 * 为 16。
                1024 * 2,         // 任务堆栈的大小指定为 * 字节数。请注意，这与普通 FreeRTOS 不同。
                NULL,             // 将用作正在创建的任务的参数的指针。
                10,               // 任务应运行的优先级。
                NULL);            // 用于传回一个句柄，通过该句柄可以引用创建的任务
    ding_shi_qi();
    shi_jian_SNTP_1();
    while (esp_netif_sntp_sync_wait(2000 / portTICK_PERIOD_MS) != ESP_OK)
    {
        ESP_LOGI(TAG, "等待系统时间设置... \n");
    }
    ESP_LOGE(TAG, "全部模块启动完成\n");
    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(8000));
    }
}
